home *** CD-ROM | disk | FTP | other *** search
/ Aminet 6 / Aminet 6 - June 1995.iso / Aminet / util / blank / bserver_v14.lha / BServer_v1.4 / Sources.lha / Sources / server / bserver.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-03-23  |  16.3 KB  |  665 lines

  1. #include <exec/types.h>
  2. #include <exec/memory.h>
  3. #include <intuition/intuition.h>
  4. #include <libraries/locale.h>
  5. #include <workbench/startup.h>
  6. #include <dos/dos.h>
  7. #include <stdio.h>
  8. #include <string.h>
  9.  
  10. #include <proto/exec.h>
  11. #include <proto/intuition.h>
  12. #include <proto/gadtools.h>
  13. #include <proto/dos.h>
  14. #include <proto/utility.h>
  15. #include <proto/commodities.h>
  16. #include <proto/locale.h>
  17. #include <clib/alib_protos.h>
  18.  
  19. #include "/include/server.h"
  20.  
  21. /* Per la localizzazione */
  22. #define CATCOMP_NUMBERS
  23. #define CATCOMP_BLOCK
  24. #define CATCOMP_CODE
  25. #include "BServer_strings.h"
  26.  
  27. extern STRPTR __asm GetString(register __a0 struct LocaleInfo *li,
  28.                        register __d0 LONG stringNum);
  29.  
  30. /* Pulizia di una porta messaggi */
  31. extern void ClearPendingMessages(struct MsgPort *);
  32.  
  33. /* Controllo commodity */
  34. extern BOOL SetUpCommodity(int,char**);
  35. extern void RemoveCommodity(void);
  36. extern void HandleCxMessages(void);
  37.  
  38. /* Gestione finestra */
  39. extern void DetachGadgets( void );
  40. extern void AttachGadgets( void );
  41. extern BOOL PopUpWindow(void);
  42. extern void ShutWindow(void);
  43. extern void HandleWindowMessages(void);
  44.  
  45. /* Builtin blanker */
  46. extern BOOL PopUpBlackScreen(void);
  47. extern void CloseBlackScreen(void);
  48.  
  49. /* Fa partire i clienti nella ClientList */
  50. extern BOOL StartClient( struct ClientNode * );
  51. extern void GetClientNames( char * );
  52. extern void DropClientNames( void );
  53.  
  54. /* Alloca una dinfo per un cliente */
  55. extern struct DisplayIDInformation *AllocDisplayIDInformation( ULONG );
  56. extern struct Window *window;
  57.  
  58. /* Per la trasmissione del displayID */
  59. extern ULONG DisplayID;
  60. extern char DefaultModeName[];
  61. extern struct List *CreateModeList( void );
  62. extern void GetDisplayNodeFromName( void );
  63. extern void DeleteModeList( void );
  64.  
  65. extern struct IntuitionBase *IntuitionBase;
  66. extern struct Library *IconBase, *GadToolsBase, *UtilityBase, *CxBase;
  67. extern struct Gadget *list_gdg;
  68.  
  69. struct Library *LocaleBase;
  70. struct LocaleInfo li;
  71. char *msg_timeout, *msg_random, *key_random,
  72.      *msg_hide, *key_hide, *msg_quit, *key_quit, *msg_blank, *key_blank,
  73.      *msg_killsel, *key_killsel, *msg_addcli, *key_addcli, *msg_brilevel;
  74.  
  75. extern struct NewBroker newbroker;
  76. extern struct TagItem sourcetags[];
  77.  
  78. char *version = "$VER: "PROGRAMNAME" "PROGRAMVERSION" "__AMIGADATE__;
  79.  
  80. /* Per la notifica dei vari eventi */
  81. struct MsgPort *handlerPort, *timerMPort, *clientMPort;
  82. struct Task *thisTask;
  83. UBYTE handlerSigBit, timerSigBit;
  84. ULONG handlerSignal, timerSignal;
  85. extern ULONG CXSignal, windowSignal, timerSignal;
  86.  
  87.  
  88. BOOL StayCool = TRUE;            /* Terminazione */
  89. BOOL Blanking = FALSE;
  90. BOOL RandomClient = TRUE;        /* Deve essere scelto a caso? */
  91. BOOL CommodityActive = TRUE;    /* Deve effettuare il blank? */
  92. BOOL PopUp = FALSE;                /* Deve aprire la finestra? */
  93. UWORD timeElapsed;                /* Tempo passato dall'ultimo evento */
  94. UWORD delaySecs, delayEvents;    /* Secondi da passare trasform. in Ticks */
  95. UBYTE briLevel = 100;            /* Livello di luminosità */
  96. UWORD DefaultClient = 0;
  97. UWORD TotalClients = 0;    
  98. BOOL stop_on_mouse = TRUE, stop_on_disk = TRUE;
  99.  
  100. #define MUST_RETRY 0
  101. #define MUST_BLANK 1
  102.  
  103. BOOL BlankStatus = MUST_RETRY;
  104.  
  105. /* Usate nella scelta del cliente per non toccare le originali  */
  106. /* In caso di fallimento infatti vanno modificate per scandire  */
  107. /* la lista dalla fine all'inizio alla ricerca di un nuovo cli: */
  108.  
  109. UWORD copy_of_DefaultClient = (UWORD)~0;
  110. BOOL copy_of_RandomClient = (UWORD)~0;
  111.  
  112. #define BLANKING_NONE      0
  113. #define BLANKING_BUILTIN   1
  114. #define BLANKING_EXTERN    2
  115.  
  116. /* Prototipi delle funzioni */
  117. struct ClientMessage *AllocClientMessage( ULONG );
  118. void FreeClientMessage( struct ClientMessage * );
  119. struct ClientNode *FindClientNode( UWORD );
  120. void RemoveClient( UWORD, char * );
  121.  
  122. void SendCommandToClient( ULONG );
  123. void QuitClients( void );
  124. void HandleClients(void);
  125. struct MsgPort *SetUpServerPort(void);
  126. void RemoveServerPort(void);
  127.  
  128. void StartBlanking(void);
  129. void StopBlanking(void);
  130.  
  131. void ProcessUserMessages(void);
  132. void main(int,char**);
  133.  
  134.  /*************************
  135.  *                        *
  136.  * HANDLE EXTERN PROGRAMS *
  137.  *                        *
  138.  *************************/
  139.  
  140. struct MsgPort *ServerPort;
  141. ULONG serverSignal;
  142. UBYTE blankingAction;
  143.  
  144. struct List ClientsList;
  145.  
  146.  
  147. struct ServerMessage *AllocServerMessage( ULONG command )
  148. {
  149. struct ServerMessage *bmsg;
  150.  
  151. if ( bmsg = AllocVec( sizeof(struct ServerMessage), MEMF_PUBLIC | MEMF_CLEAR ) )
  152.     {
  153.     bmsg->sm_Msg.mn_Node.ln_Type = NT_MESSAGE;
  154.     bmsg->sm_Msg.mn_ReplyPort = ServerPort;
  155.     bmsg->sm_Msg.mn_Length = sizeof(struct ServerMessage);
  156.     bmsg->sm_Command = command;
  157.     }
  158. return( bmsg );
  159. }
  160.  
  161.  
  162. void FreeServerMessage( struct ServerMessage *bmsg )
  163. {
  164. FreeVec( bmsg );
  165. }
  166.  
  167.  
  168. struct ClientNode *FindClientNode( UWORD clientNumber )
  169. {
  170. struct ClientNode *node = (struct ClientNode *)ClientsList.lh_Head;
  171. UWORD counter = 0;
  172.  
  173. while ( counter < clientNumber )
  174.     {
  175.     counter++;
  176.     node = (struct ClientNode *)node->cn_Node.ln_Succ;
  177.     }
  178.  
  179. return( node );
  180. }
  181.  
  182.  
  183. void RemoveClient( UWORD clientNumber, char *clientName )
  184. {
  185. struct ClientNode *node;
  186.  
  187. node = FindClientNode( clientNumber );
  188.  
  189. if ( node != (struct ClientNode *)ClientsList.lh_Head )
  190.     {
  191.     DetachGadgets();
  192.     Remove( (struct Node *)node );
  193.     FreeMem( node, sizeof(struct ClientNode) );
  194.     TotalClients--;
  195.  
  196.     if ( clientNumber < TotalClients )
  197.         DefaultClient = clientNumber;
  198.     else
  199.         DefaultClient = TotalClients;
  200.  
  201.     AttachGadgets();
  202.     }
  203. }
  204.  
  205.  
  206. void SendCommandToClient( ULONG command )
  207. {
  208. struct ServerMessage *bmsg;
  209.  
  210. if ( clientMPort && (bmsg = AllocServerMessage( command )))
  211.     {
  212.     PutMsg( clientMPort, (struct Message *)bmsg );
  213.     do
  214.         WaitPort( ServerPort );
  215.     while ( !(GetMsg( ServerPort )) );
  216.  
  217.     FreeServerMessage( bmsg );
  218.     }
  219. }
  220.  
  221.  
  222. void HandleClients( void )
  223. {
  224. struct ClientMessage *bmsg;
  225.  
  226. while( bmsg = (struct ClientMessage *)GetMsg( ServerPort ) )
  227.     {
  228.     switch ( bmsg->cm_Action )
  229.         {
  230.         case ACTION_ARRIVED:
  231.             if ( !Blanking )
  232.                 {
  233.                 clientMPort = bmsg->cm_Msg.mn_ReplyPort;
  234.                 bmsg->DInfo = AllocDisplayIDInformation( DisplayID );
  235.                 blankingAction = BLANKING_EXTERN;
  236.                 BlankStatus = MUST_BLANK;
  237.                 Blanking = TRUE;
  238.                 }
  239.             break;
  240.         case ACTION_FAILED:
  241.             if ( Blanking )
  242.                 {
  243.                 Blanking = FALSE;
  244.                 if ( RandomClient != 0 )
  245.                     {
  246.                     RandomClient = 0;
  247.                     DefaultClient = TotalClients;
  248.                     }
  249.                 else
  250.                     DefaultClient--;
  251.                 StartBlanking();
  252.                 }
  253.         default:
  254.             break;
  255.         }
  256.     ReplyMsg( (struct Message *)bmsg );
  257.     }
  258. }
  259.  
  260.  
  261. struct MsgPort *SetUpServerPort( void )
  262. {
  263. if ( ServerPort = CreatePort( SERVERPORTNAME, 0 ) )
  264.     serverSignal = 1L << ServerPort->mp_SigBit;
  265. return( ServerPort );
  266. }
  267.  
  268.  
  269. void RemoveServerPort( void )
  270. {
  271. DeletePort( ServerPort );
  272. }
  273.  
  274.  
  275.  /*****************
  276.  *                *
  277.  * Blanking stuff *
  278.  *                *
  279.  *****************/
  280.  
  281. UWORD ActiveClient;
  282.  
  283. void StartBlanking( void )
  284. {
  285. ULONG secs, micr;
  286.  
  287. clientMPort = NULL;
  288.  
  289. if ( !Blanking )
  290.     {
  291.     if ( copy_of_DefaultClient == ~0 )
  292.         {
  293.         copy_of_DefaultClient = DefaultClient;
  294.         copy_of_RandomClient = RandomClient;
  295.         }
  296.  
  297.     if ( window )
  298.         ClearPendingMessages( window->UserPort );
  299.  
  300.     if ( TotalClients )
  301.         {
  302.         if ( RandomClient )
  303.             {
  304.             CurrentTime( &secs, &micr );
  305.             ActiveClient = secs % TotalClients + 1;
  306.             }
  307.         else
  308.             ActiveClient = DefaultClient;
  309.         }
  310.  
  311.     if ( !ActiveClient )
  312.         {
  313.         if ( PopUpBlackScreen() )
  314.             {
  315.             blankingAction = BLANKING_BUILTIN;
  316.             Blanking = TRUE;
  317.             }
  318.         else
  319.             {
  320.             DisplayBeep( NULL );
  321.             blankingAction = BLANKING_NONE;
  322.             Blanking = TRUE;
  323.             }
  324.         }
  325.     else
  326.         {
  327.         if ( !StartClient( FindClientNode( ActiveClient ) ) )
  328.             {
  329.             RandomClient = 0;
  330.             DefaultClient--;
  331.             StartBlanking();
  332.             }
  333.         else
  334.             /* Blanking = TRUE <=> ACTION_ARRIVED */
  335.             blankingAction = BLANKING_EXTERN;
  336.         }
  337.     }
  338. }
  339.  
  340.  
  341. void StopBlanking( void )
  342. {
  343. if ( blankingAction == BLANKING_BUILTIN )
  344.     CloseBlackScreen();
  345. else
  346. if ( blankingAction == BLANKING_EXTERN )
  347.     SendCommandToClient( COMMAND_QUIT );
  348.  
  349. Blanking = FALSE;
  350. blankingAction = BLANKING_NONE;
  351.  
  352. DefaultClient = copy_of_DefaultClient;
  353. RandomClient = copy_of_RandomClient;
  354.  
  355. copy_of_DefaultClient = (UWORD)~0;
  356. copy_of_RandomClient = (UWORD)~0;
  357. }
  358.  
  359.  
  360.  /*******************
  361.  *                  *
  362.  * PROCESS MESSAGES *
  363.  *                  *
  364.  *******************/
  365.  
  366. void ProcessUserMessages(void)
  367. {
  368. ULONG signal;
  369.  
  370. while( StayCool )
  371.     {
  372.     signal = Wait( CXSignal | windowSignal | serverSignal | handlerSignal | timerSignal | SIGBREAKF_CTRL_C );
  373.  
  374.     if ( signal & CXSignal )
  375.         HandleCxMessages();
  376.  
  377.     if ( signal & windowSignal )
  378.         HandleWindowMessages();
  379.  
  380.     if ( signal & serverSignal )
  381.         HandleClients();
  382.  
  383.     if ( signal & timerSignal && CommodityActive )
  384.         StartBlanking();
  385.  
  386.     if ( signal & handlerSignal )
  387.         StopBlanking();
  388.  
  389.     if ( signal & SIGBREAKF_CTRL_C )
  390.         StayCool = FALSE;
  391.     }
  392.  
  393. if ( Blanking )
  394.     StopBlanking();
  395. }
  396.  
  397.  
  398.  /***************
  399.  *              *
  400.  * MAIN PROGRAM *
  401.  *              *
  402.  ***************/
  403.  
  404. #define POP_KEY_ID      100
  405.  
  406. extern CxObj *broker , *sender, *translate;
  407. CxObj *hotkeyfilter;
  408. CxObj *mousefilter, *timerfilter, *keyfilter;
  409.  
  410. extern struct NewBroker newbroker;
  411. extern struct MsgPort *broker_mp;
  412.  
  413.  
  414. void __interrupt __saveds BlankerAction(CxMsg *CxMsg,CxObj *CO)
  415. {
  416. struct InputEvent *IE=(struct InputEvent *)CxMsgData(CxMsg);
  417.  
  418. if ( IE->ie_Class == IECLASS_TIMER )
  419.     {
  420.     if ( delaySecs && ++timeElapsed >= delayEvents && BlankStatus != MUST_BLANK )
  421.         {
  422.         BlankStatus = MUST_BLANK;
  423.         Signal( thisTask, timerSignal );
  424.         }
  425.     }
  426. else
  427.     {
  428.     if ( !Blanking ||
  429.         (IE->ie_Class == IECLASS_RAWMOUSE && (IE->ie_Code != IECODE_NOBUTTON || stop_on_mouse)) ||
  430.         ((IE->ie_Class == IECLASS_DISKREMOVED || IE->ie_Class == IECLASS_DISKINSERTED) && stop_on_disk ) ||
  431.         IE->ie_Class == IECLASS_RAWKEY )
  432.         {
  433.         timeElapsed = 0;
  434.         if ( BlankStatus != MUST_RETRY )
  435.             {
  436.             BlankStatus = MUST_RETRY;
  437.             Signal( thisTask, handlerSignal );
  438.             }
  439.         }
  440.     }
  441. }
  442.  
  443.  
  444. extern char wname[100];
  445. extern struct NewMenu bservernewmenus[];
  446. extern struct EasyStruct easyabout;
  447.  
  448. void main( int argc, char *argv[] )
  449. {
  450. struct WBStartup *WBenchMsg;
  451. struct ClientNode *firstNode;
  452. CxObj *customobj;
  453. char hotkey[100];
  454. char ListName[100];
  455. struct List *list;
  456. UWORD len;
  457.  
  458. li.li_Catalog = NULL;
  459. if ( LocaleBase = OpenLibrary( "locale.library", 38L ) )
  460.     {
  461.     li.li_LocaleBase = LocaleBase;
  462.     li.li_Catalog = OpenCatalogA( NULL, "BServer.catalog", NULL );
  463.  
  464.     msg_random = GetString( &li, MSG_RANDOM );
  465.     msg_hide = GetString( &li, MSG_HIDE );
  466.     msg_quit = GetString( &li, MSG_QUIT );
  467.     msg_blank = GetString( &li, MSG_BLANK );
  468.     msg_killsel = GetString( &li, MSG_REMOVECLIENT );
  469.     msg_addcli = GetString( &li, MSG_ADDCLIENT );
  470.     }
  471. else
  472.     {
  473.     msg_random = "Random";
  474.     msg_hide = "Hide";
  475.     msg_quit = "Quit";
  476.     msg_blank = "Blank";
  477.     msg_killsel = "Remove client";
  478.     msg_addcli = "Add client";
  479.     }
  480.  
  481. sourcetags[0].ti_Data = (ULONG)GetString( &li, MSG_SELECT_CLIENTS );
  482. newbroker.nb_Descr = GetString( &li, MSG_BROKER );
  483. msg_timeout = GetString( &li, MSG_TIMEOUT );
  484. key_random = GetString( &li, MSG_RANDOM_KEY );
  485. key_hide = GetString( &li, MSG_HIDE_KEY );
  486. key_quit = GetString( &li, MSG_QUIT_KEY );
  487. key_blank = GetString( &li, MSG_BLANK_KEY );
  488. key_killsel = GetString( &li, MSG_REMOVECLIENT_KEY );
  489. key_addcli = GetString( &li, MSG_ADDCLIENT_KEY );
  490. msg_brilevel = GetString( &li, MSG_BRILEVEL );
  491. bservernewmenus[0].nm_Label = GetString( &li, MSG_MENUPROJECT );
  492. bservernewmenus[1].nm_Label = GetString( &li, MSG_MENUABOUT );
  493. bservernewmenus[1].nm_CommKey = GetString( &li, MSG_MENUABOUT_HK );
  494. bservernewmenus[2].nm_Label = GetString( &li, MSG_MENUHIDE );
  495. bservernewmenus[2].nm_CommKey = GetString( &li, MSG_MENUHIDE_HK );
  496. bservernewmenus[3].nm_Label = GetString( &li, MSG_MENUQUIT );
  497. bservernewmenus[3].nm_CommKey = GetString( &li, MSG_MENUQUIT_HK );
  498. bservernewmenus[4].nm_Label = GetString( &li, MSG_MENUINPUTEVENTS );
  499. bservernewmenus[5].nm_Label = GetString( &li, MSG_MENUIECLASSRAWMOUSE );
  500. bservernewmenus[5].nm_CommKey = GetString( &li, MSG_MENUIECLASSRAWMOUSE_HK );
  501. bservernewmenus[6].nm_Label = GetString( &li, MSG_MENUIECLASSDISK );
  502. bservernewmenus[6].nm_CommKey = GetString( &li, MSG_MENUIECLASSDISK_HK );
  503. easyabout.es_TextFormat = GetString( &li, MSG_MENUABOUTREPLY  );
  504. easyabout.es_GadgetFormat = GetString( &li, MSG_MENUABOUTGADS );
  505.  
  506. if ( IntuitionBase = (struct IntuitionBase *)OpenLibrary( "intuition.library", 37L ) )
  507.     {
  508.     if ( UtilityBase = OpenLibrary( "utility.library", 37L ) )
  509.         {
  510.         if ( argc )
  511.             {
  512.             struct RDArgs *rdargs;
  513.             LONG argres[12] = { 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L };
  514.  
  515.             if ( rdargs = ReadArgs( "CX_PRIORITY/K/N,CX_POPUP/S,CX_HOTKEY/K,R=RANDOM/S,T=TIMEOUT/K/N,D=DISPLAY/K,L=LIST/K,B=BRIGHTNESS/K/N,NM=NOMOUSE/S,ND=NODISK/S", argres, NULL ) )
  516.                 {
  517.                 newbroker.nb_Pri = ( argres[0] ? *(ULONG *)argres[0] : 0 );
  518.                 PopUp = ( argres[1] ? TRUE : FALSE );
  519.                 strcpy( hotkey, ( argres[2] ? (char *)argres[2] : "lalt b" ) );
  520.                 RandomClient = ( argres[3] ? TRUE : FALSE );
  521.                 delaySecs = ( argres[4] ? *(ULONG *)argres[5] : 60 );
  522.                 if ( argres[5] )
  523.                     strcpy( DefaultModeName, (char *)argres[5] );
  524.                 strcpy( ListName, ( argres[6] ? (char *)argres[6] : "ClientList" ) );
  525.                 briLevel = ( argres[7] ? *(ULONG *)argres[7] : 100 );
  526.                 stop_on_mouse = ( argres[8] ? FALSE : TRUE );
  527.                 stop_on_disk = ( argres[9] ? FALSE : TRUE );
  528.                 FreeArgs( rdargs );
  529.                 }
  530.             else PrintFault( IoErr(), "BServer" );
  531.             }
  532.         else
  533.             {
  534.             if ( IconBase = OpenLibrary( "icon.library", 37L ) )
  535.                 {
  536.                 char **tooltypes = (char **)ArgArrayInit( argc, argv );
  537.                 newbroker.nb_Pri = ArgInt( tooltypes, "CX_PRIORITY", 0 );
  538.                 strcpy( hotkey, ArgString( tooltypes, "CX_HOTKEY", "lalt b" ) );
  539.                 delaySecs = ArgInt( tooltypes, "TIMEOUT", 3 );
  540.                 briLevel = ArgInt( tooltypes, "BRIGHTNESS", 100 );
  541.                 strcpy( ListName, ArgString( tooltypes, "LIST", "ClientList" ) );
  542.  
  543.                 PopUp =
  544.                     !Stricmp(ArgString(tooltypes, "CX_POPUP", "NO"), "YES" );
  545.                 RandomClient =
  546.                     !Stricmp(ArgString(tooltypes, "RANDOM", "YES"), "YES" );
  547.                 strcpy( DefaultModeName, ArgString( tooltypes, "DISPLAY", NULL ) );
  548.                 stop_on_mouse = 
  549.                     !Stricmp(ArgString(tooltypes, "NOMOUSE", "YES"), "YES" );
  550.                 stop_on_disk = 
  551.                     !Stricmp(ArgString(tooltypes, "NODISK", "YES"), "YES" );
  552.  
  553.                 ArgArrayDone();
  554.                 CloseLibrary( IconBase );
  555.                 }
  556.  
  557.             WBenchMsg = (struct WBStartup *)argv;
  558.             if ( WBenchMsg->sm_NumArgs - 1 )
  559.                 {
  560.                 register struct WBArg *arg = WBenchMsg->sm_ArgList;
  561.                 arg++;
  562.                 CurrentDir( arg->wa_Lock );
  563.                 strcpy( ListName, arg->wa_Name );
  564.                 }
  565.             }
  566.         CloseLibrary( UtilityBase );
  567.         }
  568.  
  569.     if ( stop_on_mouse )
  570.         bservernewmenus[5].nm_Flags |= CHECKED;
  571.     if ( stop_on_disk )
  572.         bservernewmenus[6].nm_Flags |= CHECKED;
  573.  
  574.     if ( list = CreateModeList() )
  575.         {
  576.         GetDisplayNodeFromName();
  577.         DeleteModeList();
  578.         }
  579.  
  580.     delayEvents = delaySecs * 10;
  581.  
  582.     if ( CxBase = OpenLibrary( "commodities.library", 37L ) )
  583.         {
  584.         if ( GadToolsBase = OpenLibrary( "gadtools.library", 0L ) )
  585.             {
  586.             if ( broker_mp = CreateMsgPort() )
  587.                 {
  588.                 CXSignal = 1L << broker_mp->mp_SigBit;
  589.                 newbroker.nb_Port = broker_mp;
  590.  
  591.                 if ( broker = CxBroker( &newbroker, NULL ) )
  592.                     {
  593.                     if ( (handlerSigBit = AllocSignal( -1 )) != -1 )
  594.                         {
  595.                         handlerSignal = 1L << handlerSigBit;
  596.  
  597.                         if ( (timerSigBit = AllocSignal( -1 )) != -1 )
  598.                             {
  599.                             timerSignal = 1L << timerSigBit;
  600.  
  601.                             thisTask = FindTask( NULL );
  602.  
  603.                             if ( customobj = CxCustom( BlankerAction, 0L ) )
  604.                                 {
  605.                                 AttachCxObj( broker, customobj );
  606.  
  607.                                 if (hotkeyfilter = HotKey(hotkey, broker_mp, 1L ) )
  608.                                     {
  609.                                     AttachCxObj( broker, hotkeyfilter );
  610.                                     strcpy(wname, PROGRAMNAME": HotKey = <");
  611.                                     len = sizeof(PROGRAMNAME": HotKey = <") - 1;
  612.                                     strncpy(wname + len, hotkey, 100 - len);
  613.                                     len = strlen(wname);
  614.                                     strncpy(wname + len, ">", 100 - len);
  615.                                     }
  616.  
  617.                                 if ( !CxObjError( hotkeyfilter ) )
  618.                                     {
  619.                                     if ( firstNode = AllocVec( sizeof(struct ClientNode), MEMF_CLEAR ) )
  620.                                         {
  621.                                         NewList( &ClientsList );
  622.                                         firstNode->cn_Node.ln_Name = GetString( &li, MSG_BUILTIN_BLANKER );
  623.                                         AddTail( &ClientsList, (struct Node *)firstNode );
  624.  
  625.                                         if ( SetUpServerPort() )
  626.                                             {
  627.                                             GetClientNames( ListName );
  628.  
  629.                                             if ( PopUp )
  630.                                                 PopUpWindow();
  631.  
  632.                                             ActivateCxObj( broker, 1L );
  633.                                             ProcessUserMessages();
  634.                                             ShutWindow();
  635.                                             DropClientNames();
  636.                                             DeletePort( ServerPort );
  637.                                             }
  638.                                         else
  639.                                             FreeVec( firstNode );
  640.                                         }
  641.                                     }
  642.                                 }
  643.                             FreeSignal( timerSigBit );
  644.                             }
  645.                         FreeSignal( handlerSigBit );
  646.                         }
  647.                     DeleteCxObjAll( broker );
  648.                     }
  649.                 DeleteMsgPort( broker_mp );
  650.                 }
  651.             CloseLibrary( GadToolsBase );
  652.             }
  653.         CloseLibrary( CxBase );
  654.         }
  655.     CloseLibrary( (struct Library *)IntuitionBase );
  656.     }
  657.  
  658. if ( LocaleBase )
  659.     {
  660.     if ( li.li_Catalog )
  661.         CloseCatalog( li.li_Catalog );
  662.     CloseLibrary( LocaleBase );
  663.     }
  664. }
  665.